Android SurfaceTexture

从图像流(Image Stream)中捕获帧(Frames)作为 OpenGL ES 的纹理(Texture)[1]

图像流(Image Stream):图像流是一连串图像的集合。想象观看一部电影,实际上看到的是由许多静态图像(帧,Frames)组成的序列,这些帧以足够快的速度播放,以创建连续移动的效果。在技术上,图像流可以来源于多种设备或数据源,比如摄像头捕捉的实时视频或者存储在文件中的视频数据。

纹理(Texture):在图形编程中,纹理用于给图形对象添加细节和视觉效果。可以将纹理想象为一张贴在物体表面的图像,这张图像定义了物体的外观,如颜色、图案和其他视觉效果。在3D图形中,纹理使得简单模型看起来更加复杂和真实。

OpenGL ES:是一种用于渲染2D和3D图形的编程接口(API),特别适用于移动设备、游戏机和嵌入式设备。它定义了一套函数,让开发者能够在屏幕上绘制各种图形和纹理。从而创建具有复杂渲染效果的图形应用程序,而不需要了解底层硬件的复杂性

将上述概念联系起来,Android 的 SurfaceTexture 提供了一种高效的方法,通过 OpenGL ES 将图像流中的帧捕获并作为纹理渲染。这意味着,您可以将来自摄像头、视频文件或其他图像流的帧直接渲染到OpenGL环境中,而不需要进行复杂的数据转换或处理。这样做的好处是能够实现高性能和低延迟的图像处理和显示,非常适合需要实时视频处理的应用,比如视频聊天、增强现实(AR)应用等。

SurfaceTexture 通过创建一个可以接收图像流帧的表面(Surface),然后将这些帧作为纹理传递给OpenGL ES进行渲染。开发者可以利用OpenGL ES的强大渲染能力,对这些帧进行各种图形效果的处理,如滤镜、图像变换等。


整体流程

参考《Android图形系统之SurfaceTexture》[2]

graph LR
    Canvas --> Surface[Surface
BufferQueue Producer] OpenGL --> Surface Decorder --> Surface Surface --> SurfaceTexture[SurfaceTexture
BufferQueueCore GLConsumer] SurfaceTexture --> OES[OES纹理] OES --> TextureView OES --> 纹理加工
  1. 生成图像流:来源:OpenGL、摄像头、视频解码
  2. 图像流传入 Surface
  3. 存入 BufferQueue 队列
  4. GLConsumer 消化队列,转为纹理
  5. 对纹理进行使用(特效、上屏)

创建 SurfaceTexture

使用如下代码可创建 SurfaceTexture:

new SurfaceTexture(textureId);

其中,textureId(纹理 id)是一个与 OpenGL ES 纹理对象关联的整数标识符。在 OpenGL ES 中,纹理是一种可以被应用到 3D 对象上以创建表面细节的图像。每个纹理都有一个唯一的 ID(即 textureId),用于在 OpenGL ES 的渲染过程中引用和操作这个纹理。当你创建一个 SurfaceTexture 实例时,需要提供一个 textureId,这个 textureId 指向一个已经由 OpenGL ES 环境创建和初始化的纹理。


网络资源


  1. SurfaceTexture  |  Android Developers ↩︎

  2. Android图形系统之SurfaceTexture - 掘金 ↩︎


本文作者:Maeiee

本文链接:Android SurfaceTexture

版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!